package com.totoro.tygeneratedragonblock.executor.action;

import com.totoro.tygeneratedragonblock.TyGenerateDragonBlock;
import com.totoro.tygeneratedragonblock.data.ComputeResult;
import com.totoro.tygeneratedragonblock.utils.ColorUtil;
import com.totoro.tygeneratedragonblock.utils.ProbabilityUtil;
import com.totoro.tygeneratedragonblock.utils.TagUtil;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;

import java.util.Map;

public interface ActionExecutor {
    /**
     * @author totoro
     * @description 解析执行语句的标签，如果String返回null则代表概率不通过，不执行
     * @date  14:54
     * @param [parseValueMap, actionText]
     * @return java.lang.String
     **/
    default String parseValueMap(Map<String, ComputeResult> parseValueMap, String actionText) {
        String originalActionText = actionText;
        // 判断是否有概率
        String probabilityTag = TagUtil.getActionProbabilityTag(actionText);
        // 如果有概率先计算概率
        if(null != probabilityTag) {
            // 有概率，那么将actionText的概率清除掉
            actionText = actionText.replace(probabilityTag, "");
            // 获取波浪键后的标签，这个标签内容用来计算概率
            probabilityTag = probabilityTag.substring(1);
            // 判断这个标签是否在parseValueMap中，如果不在则控制台提示且返回null
            if(!parseValueMap.containsKey(probabilityTag)) {
                Bukkit.getConsoleSender().sendMessage(TyGenerateDragonBlock.getInstance().getConfigManager().getConfig().getPrefix()
                        + String.format(ColorUtil.color("&c在执行语句 &e[%s] " + "&c时概率标签 &e[%s] &c不存在！"), originalActionText, probabilityTag));
                return null;
            }
            // 如果存在，判断成功是否为Null，如果为null则计算概率，不为null则解析其他标签内容再返回字符串
            ComputeResult computeResult = parseValueMap.get(probabilityTag);
            Boolean isSuccess = computeResult.getIsSuccess();
            if(null == isSuccess) {
                // 计算概率
                isSuccess = ProbabilityUtil.checkSuccess(computeResult.getResult().doubleValue());
            }
            // 如果为false，则返回null，不执行
            if(!isSuccess) {
                return null;
            }
            actionText = parseOtherTag(parseValueMap, originalActionText, actionText);
            return actionText;
        }
        // 如果没有概率那就是百分百成功
        return parseOtherTag(parseValueMap, originalActionText, actionText);
    }

    default String parseOtherTag(Map<String, ComputeResult> parseValueMap, String originalActionText, String actionText) {
        // 解析其他标签字符串并返回
        for (String tag : TagUtil.getTags(actionText)) {
            // 判断这个标签是否在parseValueMap中，如果不在则控制台提示且返回null
            if(!parseValueMap.containsKey(tag)) {
                Bukkit.getConsoleSender().sendMessage(TyGenerateDragonBlock.getInstance().getConfigManager().getConfig().getPrefix()
                        + String.format(ColorUtil.color("&c在执行语句 &e[%s] " + "&c时概率标签 &e[%s] &c不存在！"), originalActionText, tag));
                return null;
            }
            // 获取标签并替换结果值
            actionText = actionText.replace(tag, String.valueOf(parseValueMap.get(tag).getResult()));
        }
        return actionText;
    }
    void execute(Map<String, ComputeResult> parseValueMap, String actionText, Player player);
}
